const testObj = {
  id: 123,
  name: "seafwg",
};

const handleFn = {
  /**
   * get对象的拦截器
   * @param {*} obj 对象本身
   * @param {*} prop 当前访问的属性
   * @returns
   */
  get: (obj, prop, itemProxy) => {
    console.log("itemProxy :>> ", itemProxy);
    return obj[prop];
  },
  /**
   * set函数拦截器
   * @param {*} obj 对象本身
   * @param {*} prop 当前修改属性
   * @param {*} val 当前对象修改值
   */
  set: (obj, prop, val) => {
    console.log("set function exe...");
    // console.log('val :>> ', val)
    // console.log('obj :>> ', obj)
    // console.log('prop :>> ', prop)

    return (obj[prop] = val);
  },
};

const testProxy = new Proxy(testObj, handleFn);

// testProxy.age = 234

// export const arrExpand = new Proxy(arr, arrHandleFn)
/**
 * 实现数组负数下标的访问
 * @param {*} arr
 * @returns
 */
const arrExpand = (arr) => {
  if (!Array.isArray(arr)) {
    throw new Error("param type error... param type is Array");
  }
  return new Proxy(arr, {
    get: (arr1, prop) => {
      // Number.isInteger()判断一个数是否为整形
      if (Number(prop) != NaN && Number.isInteger(Number(prop)) && Number(prop) < 0) {
        prop = String(arr1.length + Number(prop));
      }
      return arr1[prop];
    },
    set: (obj, prop, val, itemProxy) => {
      return (obj[prop] = val);
    },
  });
};

module.exports = {
  testProxy,
  arrExpand,
};

// proxy对象类型的中间件，对象的获取和设置进行拦截操作
